package com.example.demo.controller;

import java.awt.Color;
import java.awt.Font;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.apache.commons.codec.binary.Base64;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.PieDataset;

public class CreateChart {

    private static  String CHART_PATH = "";

    public CreateChart(String path){
        this.CHART_PATH = path;
    }


   private CreateChart() {
       // TODO Auto-generated constructor stub
   }


   /**
    * 饼状图
    * 
    * @param dataset 数据集
    * @param chartTitle 图标题
    * @param charName 生成图的名字
    * @param pieKeys 分饼的名字集
    * @return
    */
   public static String createValidityComparePimChar(PieDataset dataset,
           String chartTitle, String charName, String[] pieKeys) {
       JFreeChart chart = ChartFactory.createPieChart(chartTitle, // chart
               // title
               dataset,// data
               true,// include legend
               true, false);

       // 使下说明标签字体清晰,去锯齿类似于
       // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);的效果
       chart.setTextAntiAlias(false);
       // 图片背景色
       chart.setBackgroundPaint(Color.white);
       // 设置图标题的字体重新设置title
       Font font = new Font("隶书", Font.BOLD, 25);
       TextTitle title = new TextTitle(chartTitle);
       title.setFont(font);
       chart.setTitle(title);

       PiePlot  plot = (PiePlot) chart.getPlot();
       // 图片中显示百分比:默认方式

       // 指定饼图轮廓线的颜色
       // plot.setBaseSectionOutlinePaint(Color.BLACK);
       // plot.setBaseSectionPaint(Color.BLACK);

       // 设置无数据时的信息
       plot.setNoDataMessage("无对应的数据，请重新查询。");

       // 设置无数据时的信息显示颜色
       plot.setNoDataMessagePaint(Color.red);

       // 图片中显示百分比:自定义方式，{0} 表示选项， {1} 表示数值， {2} 表示所占比例 ,小数点后两位
       plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
               "{0}={1}({2})", NumberFormat.getNumberInstance(),
               new DecimalFormat("0.00%")));
       // 图例显示百分比:自定义方式， {0} 表示选项， {1} 表示数值， {2} 表示所占比例
       plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
               "{0}={1}({2})"));//设置鼠标  滑过图表是显示鼠标当前片区的提示信息。 

       plot.setLabelFont(new Font("SansSerif", Font.TRUETYPE_FONT, 12));

       // 指定图片的透明度(0.0-1.0)
       plot.setForegroundAlpha(1f);
       // 指定显示的饼图上圆形(false)还椭圆形(true)
       //plot.setCircular(false, true);
       plot.setCircular(false);
       plot.setLabelGap(0.02);
       // 设置第一个 饼块section 的开始位置，默认是12点钟方向
       //plot.setStartAngle(90);

      /* // // 设置分饼颜色
       plot.setSectionPaint(pieKeys[0], new Color(47, 69, 84));
       plot.setSectionPaint(pieKeys[1], new Color(213, 58, 53));
       plot.setSectionPaint(pieKeys[2], new Color(96, 96, 191));  
       plot.setSectionPaint(pieKeys[3], new Color(64, 64, 159));  
       plot.setSectionPaint(pieKeys[4], new Color(32, 32, 127));  
       plot.setSectionPaint(pieKeys[5], new Color(0, 0, 111));  */
       
       FileOutputStream fos_jpg = null;
       try {
           // 文件夹不存在则创建
//           isChartPathExist(CHART_PATH);
//           String chartName = "D:/workspace1/happyReading/src/main/webapp/exportWord/" + charName;
           String chartName =  CHART_PATH+ charName;
//           System.out.println("charName:"+chartName);
           fos_jpg = new FileOutputStream(chartName);
           // 高宽的设置影响椭圆饼图的形状
           ChartUtilities.writeChartAsPNG(fos_jpg, chart, 655, 433);

           return chartName;
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       } finally {
           try {
               fos_jpg.close();
           } catch (Exception e) {
               e.printStackTrace();
           } 
       }

   }
   
   /**
    * 柱状图
    * 
    *@param dataset 数据集
    * @param xName x轴的说明（如种类，时间等）
    * @param yName y轴的说明（如速度，时间等）
    * @param chartTitle 图标题
    * @param charName 生成图片的名字
    * @return
    */
   public String createBarChart(CategoryDataset dataset, String xName,
           String yName, String chartTitle, String charName) {
       JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题
               xName, // 目录轴的显示标签
               yName, // 数值轴的显示标签
               dataset, // 数据集
               PlotOrientation.VERTICAL, // 图表方向：水平、垂直
               true, // 是否显示图例(对于简单的柱状图必须是false)
               false, // 是否生成工具
               false // 是否生成URL链接
               );
       Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
       Font titleFont = new Font("黑体", Font.BOLD, 20);    
       Font plotFont = new Font("宋体", Font.PLAIN, 16);    
       Font LegendFont = new Font("楷体", Font.PLAIN, 18);   
       TextTitle textTitle2 = chart.getTitle();  
       textTitle2.setFont(titleFont);// 为标题设置上字体  

       LegendTitle legend2 = chart.getLegend(0);  
       legend2.setItemFont(LegendFont);// 为图例说明设置字体  

       CategoryPlot categoryPlot = chart.getCategoryPlot();  
       categoryPlot.getRangeAxis().setLabelFont(plotFont);// 设置Y轴标识字体  
       categoryPlot.getDomainAxis().setLabelFont(plotFont);// 设置X轴标识字体  
       categoryPlot.getDomainAxis().setTickLabelFont(plotFont);// 设置轴标记的坐标的标记字体  
       /*
        * VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
        * 使用的关闭抗锯齿后，字体尽量选择12到14号的宋体字,这样文字最清晰好看
        */
       // chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
//       chart.setTextAntiAlias(false);
//       chart.setBackgroundPaint(Color.white);
//       // create plot
//       CategoryPlot plot = chart.getCategoryPlot();
//       // 设置横虚线可见
//       plot.setRangeGridlinesVisible(true);
//       // 虚线色彩
//       plot.setRangeGridlinePaint(Color.gray);

       // 数据轴精度
//       NumberAxis vn = (NumberAxis) plot.getRangeAxis();
       // vn.setAutoRangeIncludesZero(true);
       DecimalFormat df = new DecimalFormat("#0.00");
//       vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
       // x轴设置

//       CategoryAxis domainAxis = plot.getDomainAxis();
//       domainAxis.setLabelFont(labelFont);// 轴标题

//       domainAxis.setTickLabelFont(labelFont);// 轴数值

       // Lable（Math.PI/3.0）度倾斜
       // domainAxis.setCategoryLabelPositions(CategoryLabelPositions
       // .createUpRotationLabelPositions(Math.PI / 3.0));

//       domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示

       // 设置距离图片左端距离
//       domainAxis.setLowerMargin(0.1);
       // 设置距离图片右端距离
//       domainAxis.setUpperMargin(0.1);
       // 设置 columnKey 是否间隔显示
       // domainAxis.setSkipCategoryLabelsToFit(true);

//       plot.setDomainAxis(domainAxis);
       // 设置柱图背景色（注意，系统取色的时候要使用16位的模式来查看颜色编码，这样比较准确）
//       plot.setBackgroundPaint(new Color(255, 255, 204));

       // y轴设置
//       ValueAxis rangeAxis = plot.getRangeAxis();
//       rangeAxis.setLabelFont(labelFont);
//       rangeAxis.setTickLabelFont(labelFont);
//       // 设置最高的一个 Item 与图片顶端的距离
//       rangeAxis.setUpperMargin(0.15);
//       // 设置最低的一个 Item 与图片底端的距离
//       rangeAxis.setLowerMargin(0.15);
//       plot.setRangeAxis(rangeAxis);

       BarRenderer renderer = new BarRenderer();
       // 设置柱子宽度
       renderer.setMaximumBarWidth(0.05);
       // 设置柱子高度
       renderer.setMinimumBarLength(0.2);
       // 设置柱子边框颜色
       renderer.setBaseOutlinePaint(Color.BLACK);
       // 设置柱子边框可见
       renderer.setDrawBarOutline(true);

       // // 设置柱的颜色
       renderer.setSeriesPaint(0, new Color(204, 255, 255));
       renderer.setSeriesPaint(1, new Color(153, 204, 255));
       renderer.setSeriesPaint(2, new Color(51, 204, 204));

       // 设置每个地区所包含的平行柱的之间距离
       renderer.setItemMargin(0.0);

       // 显示每个柱的数值，并修改该数值的字体属性
       renderer.setIncludeBaseInRange(true);
       renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
       renderer.setBaseItemLabelsVisible(true);

//       plot.setRenderer(renderer);
       // 设置柱的透明度
//       plot.setForegroundAlpha(1.0f);

       FileOutputStream fos_jpg = null;
       try {
//           isChartPathExist(CHART_PATH);
           String chartName = CHART_PATH + charName;
           fos_jpg = new FileOutputStream(chartName);
           ChartUtilities.writeChartAsPNG(fos_jpg, chart, 800, 450, true, 10);
           return chartName;
       } catch (Exception e) {
           e.printStackTrace();
           return null;
       } finally {
           try {
               fos_jpg.close();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
   }

   /**
    * 传入图片路径 将其转换成base64
    * 
    */
   public static String getImageStr(String imgPath) {
       String imgFile = imgPath;
       InputStream in = null;
       byte[] data = null;
       try {
           in = new FileInputStream(imgFile);
           data = new byte[in.available()];
           in.read(data);
           in.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
      // BASE64Encoder encoder = new BASE64Encoder();
    //   return encoder.encode(data);
       byte[] encodeBase64 = Base64.encodeBase64(data);
       return  new String(encodeBase64);
   }
   
}